#pragma once

// 将以下代码适配到vector和list中做反向迭代器，理解反向迭代器的原理
namespace lh
{
	// 适配器 -- 复用
	template<class Iterator, class Ref, class Ptr>
	struct Reverse_iterator
	{
		Iterator _it;
		typedef Reverse_iterator<Iterator, Ref, Ptr> RIterator;

		Reverse_iterator(Iterator it)
			:_it(it)
		{}

		RIterator operator++()
		{
			--_it;
			return *this;
		}

		RIterator operator--()
		{
			++_it;
			return *this;
		}

		//特殊，物理位置实际和正向迭代器一样，但逻辑上是前一个，实际访问需要--后解引用。
		Ref operator*()
		{
			auto tmp = _it;
			--tmp;
			return *tmp;
		}

		Ptr operator->()
		{
			return &(operator*());
		}

		bool operator!=(const RIterator cur)
		{
			return _it != cur._it;
		}
	};
	// vector和list反向迭代器实现
}